return {
  -- packer
  {'wbthomason/packer.nvim'},
  -- requires
  {'nvim-lua/plenary.nvim'},
  {
    'kyazdani42/nvim-web-devicons',
    event = "VimEnter",
  },
  {
    "ahmedkhalf/project.nvim",
    opt = false,
    config = function()
      require("project_nvim").setup {}
    end
  },
  -- fix
  {'antoinemadec/FixCursorHold.nvim'},
  -- ui
  {
    "folke/trouble.nvim",
    config = function()
      require("trouble").setup {
        height = 5,
      }
    end,
  },
  {
    "folke/lsp-colors.nvim",
    opt = false,
    event = BufRead,
    config = function()
      require("lsp-colors").setup({
        Error = "#db4b4b",
        Warning = "#e0af68",
        Information = "#0db9d7",
        Hint = "#10B981"
      })
    end
  },
  {
    "glepnir/dashboard-nvim",
    opt = false,
    config = function()
      local g = vim.g

      g.dashboard_disable_at_vimenter = 0
      g.dashboard_disable_statusline = 1
      g.dashboard_default_executive = "telescope"
      -- g.dashboard_custom_header = {}

      g.dashboard_custom_section = {
         a = { description = { "  Find File                 SPC s f" }, command = "Telescope find_files" },
         b = { description = { "  Recents                   SPC s o" }, command = "Telescope oldfiles" },
         c = { description = { "  Find Word                 SPC s c" }, command = "Telescope live_grep" },
         d = { description = { "洛 New File                  SPC f n" }, command = "DashboardNewFile" },
      }

      g.dashboard_custom_footer = {
         "   ",
      }
    end
  },
  {
    "folke/tokyonight.nvim",
    opt = true,
    event = "VimEnter",
    config = function ()
      vim.g.tokyonight_style = "night"
      vim.cmd [[colorscheme tokyonight]]
    end,
  },
  {
    "lukas-reineke/indent-blankline.nvim",
    opt = true,
    event = "VimEnter",
    config = function()
      vim.cmd [[highlight IndentBlanklineIndent1 guifg=#E06C75 gui=nocombine]]
      vim.cmd [[highlight IndentBlanklineIndent2 guifg=#E5C07B gui=nocombine]]
      vim.cmd [[highlight IndentBlanklineIndent3 guifg=#98C379 gui=nocombine]]
      vim.cmd [[highlight IndentBlanklineIndent4 guifg=#56B6C2 gui=nocombine]]
      vim.cmd [[highlight IndentBlanklineIndent5 guifg=#61AFEF gui=nocombine]]
      vim.cmd [[highlight IndentBlanklineIndent6 guifg=#C678DD gui=nocombine]]
      require("indent_blankline").setup {
        -- show_first_indent_level = false,
        char = "▏",
        filetype_exclude = {
          "help",
          "terminal",
          "packer",
          "lspinfo",
          "lsp-installer",
          "TelescopePrompt",
          "TelescopeResults",
          "dashboard",
        },
        buftype_exclude = {"terminal"},
        char_highlight_list = {
          "IndentBlanklineIndent1",
          "IndentBlanklineIndent2",
          "IndentBlanklineIndent3",
          "IndentBlanklineIndent4",
          "IndentBlanklineIndent5",
          "IndentBlanklineIndent6",
        },
      }
    end,
  },
  {
    'hoob3rt/lualine.nvim',
    opt = true,
    after = "nvim-web-devicons",
    config = function()
      require('lualine').setup {
        options = {
          theme = "dracula",
          icons_enabled = 1,
        }
      }
    end
  },
  {
    'romgrk/barbar.nvim',
    opt = true,
    after = "nvim-web-devicons",
  },
  -- treesitter
  {
    'nvim-treesitter/nvim-treesitter',
    opt = true,
    event = "BufRead",
    run = ':TSUpdate',
    config = function()
      local ensure_installed = {}

      require('nvim-treesitter.configs').setup {
        ensure_installed = ensure_installed,
        highlight = {
          enable = true,
          additional_vim_regex_highlighting = true,
        }
      }
    end
  },
  -- lsp
  {
    'neovim/nvim-lspconfig',
    event = "VimEnter",
    config = function ()
      require("plugins.lspconfig")
    end,
  },
  {
    'williamboman/nvim-lsp-installer',
    opt = true,
    after = "nvim-lspconfig",
    config = function()
      local lsp_installer = require("nvim-lsp-installer")

      lsp_installer.on_server_ready(function(server)
        local opts = {
          flags = { debounce_text_changes = 150 },
        }
        server:setup(opts)
        vim.cmd [[ do User LspAttachBuffers ]]
      end)
    end,
  },
  {
    'ray-x/lsp_signature.nvim',
    opt = true,
    after = "nvim-lspconfig",
    config = function()
      require('lsp_signature').setup()
    end,
  },
  -- snippet
  {
    'rafamadriz/friendly-snippets',
  },
  {
    'L3MON4D3/luaSnip',
    config = function ()
      local luasnip = require("luasnip")
      luasnip.config.set_config {
        history = false,
        updateevents = "TextChanged,TextChangedI",
        region_check_events = "InsertEnter",
      }
      require('luasnip/loaders/from_vscode').lazy_load()
    end,
  },
  -- autocompletion
  {
    'hrsh7th/nvim-cmp',
    opt = true,
    event = "VimEnter",
    requires = {
      {'saadparwaiz1/cmp_luasnip', opt = true},
      {'hrsh7th/cmp-nvim-lsp', opt = true},
      {'hrsh7th/cmp-buffer', opt = true},
      {'hrsh7th/cmp-path', opt = true},
    },
    config = function()
      require('plugins.nvim-cmp').setup()
    end
  },
  -- tags
  {
    'simrat39/symbols-outline.nvim',
    opt = true,
    event = "VimEnter"
  },
  -- autopairs
  {
    'windwp/nvim-autopairs',
    opt = false,
    config = function()
      require('nvim-autopairs').setup {
        disable_filetype = {'markdown'}
      }
    end
  },
  -- which-key
  {
    'folke/which-key.nvim',
    event = 'VimEnter',
    config = function()
      require('mapping')
    end
  },
  -- nvimtree
  {
    "kyazdani42/nvim-tree.lua",
    opt = true,
    after = "nvim-web-devicons",
    config = function ()
      local tree_config = require('nvim-tree.config')
      local tree_cb = tree_config.nvim_tree_callback

      local list = {
        { key = { "l", "<cr>", "<Right>", 'o'}, cb = tree_cb("edit")},
        { key = {"h", "<Left>"}, cb = tree_cb("close_node")},
        { key = "v", cb = tree_cb("vsplit")},
        { key = "r", cb = tree_cb("rename")},
        { key = "n", cb = tree_cb("create")},
        { key = "d", cb = tree_cb("remove")},
        { key = "y", cb = tree_cb("copy")},
        { key = "p", cb = tree_cb("paste")},
        { key = "x", cb = tree_cb("cut")},
        { key = "q", cb = tree_cb("close")},
        { key = "N", cb = tree_cb("create")},
      }

      require('nvim-tree').setup {
        actions = {
          open_file = {
            quit_on_open = true,
          },
        },
        view = {
          mappings = {
            custom_only = true,
            list = list,
          },
        },
        update_cwd = true,
        update_focused_file = {
          enable = true,
          update_cwd = true,
        },
      }
      vim.g.nvim_tree_respect_buf_cwd = 1
      vim.g.nvim_tree_quit_on_open = 1
      vim.g.nvim_tree_icons = {
        default = "",
        symlink = "",
        git = {
          unstaged = "✚",
          staged = "S",
          unmerged = "",
          renamed = "➜",
          deleted = "",
          untracked = "U",
          ignored = "◌",
        },
        folder = {
          default = "",
          open = "",
          empty = "",
          empty_open = "",
          symlink = "",
        },
      }
      vim.g.nvim_tree_ignore = {".git", "node_modules", ".cache"}
    end
  },
  -- telescope
  {
    'nvim-telescope/telescope.nvim',
    opt = false,
    requires = {
      {
        "nvim-telescope/telescope-fzf-native.nvim",
        run = "make",
      },
    },
    config = function ()
      local telescope = require('telescope')
      telescope.load_extension('projects')
      telescope.setup {
        extensions = {
          fzf = {
            fuzzy = true,
            override_generic_sorter = true,
            override_file_sorter = true,
            case_mode = "smart_case",
          }
        }
      }

      telescope.load_extension('fzf')
    end,
  },
  -- comment
  {
    'terrortylor/nvim-comment',
    opt = true,
    event = 'BufRead',
    config = function()
      require('nvim_comment').setup {
        marker_padding = true,
        comment_empty = false,
        create_mappings = false,
        line_mapping = nil,
        operator_mapping = nil,
        hook = nil,
      }
    end
  },
  -- git
  {
    'lewis6991/gitsigns.nvim',
    opt = true,
    event = 'BufRead',
    config = function()
      require('gitsigns').setup {
        keymaps = {},
      }
    end
  },
  -- terminal
  {
    'akinsho/toggleterm.nvim',
    event = 'BufWinEnter',
    config = function()
      require('toggleterm').setup {
        size = 55,
        shade_filetypes = {},
        direction = 'vertical',
        -- open_mapping = [[<C-t>]],
        close_on_exit = false,
      }
    end
  },
  -- debugging
  -- {
  --   'mfussenegger/nvim-dap',
  --   opt = false,
  --   config = function ()
  --     require('dap')
  --     local breakpoint = {
  --       text = '',
  --       texthl = 'LspDiagnosticsSignError',
  --       linehl = "",
  --       numhl = "",
  --     }
  --     vim.fn.sign_define('DapBreakpoint', breakpoint)
  --   end,
  -- },
}
